<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>

</body>
</html>

<script>
// 闭包的作用：
  // 闭包可以将“外部函数”的变量「持久化」。

// 重新回顾：
  // 1. outer() 执行完后，其内部的 i 这个变量，会被 垃圾回收。
  // 2. 全局变量，获得的数据，永远不会被释放； 除非 全局变量 = null 或 浏览器被关闭。
/* 
  function outer() {
    let i = 0;
    function inner() {
      console.log(i);
    }
    inner();
  }

  outer();
*/

function outer() {
  let i = 0;
  function inner() {
    i++;
    console.log(i);
  }
  return inner;
}


const f = outer();
// f 获得的是 inner 函数的引用。
// 因为 inner 函数本质还是 对象， f 是全局变量，所以 inner 函数 永远不会被释放。
// 因为 inner 不会被释放，索引 inner 函数中 闭包引用的 i 也不会被释放。
  // 即 通过，闭包，实现了 将“ 外部函数/outer” 的变量「持久化 - 即变量不被垃圾回收」。

f(); // 1
f(); // 2
f(); // 3
f(); // 4
// ....


// 总结：闭包本质 外部函数，return 出来一个 内部函数；其内部函数的引用 被 全局变量接收
  // 因为全局变量不会被销毁，所以 全局变量引用的 内部函数也不会被销毁
    // 若内部函数，引用了外部函数的变量，则外部函数的变量也不会被销毁。

</script>
